Unidad 2: Herramientas para el manejo de datos

Manejo y Visualización de Datos Maestría en Estadística Aplicada - FCEyE - UNR

1 Introducción

  • En esta unidad haremos un recorrido por los primeros pasos del proceso de análisis de datos:

    1. Importación
    2. Manipulación
    3. Validación
    4. Resumen

  • Las etapas siguientes (visualización, ajuste, comunicación, etc.) serán tratadas más adelante.

  • Paquetes necesarios de R:

library(readr)
library(readxl)
library(tidyr)
library(data.table)
  • Comenzamos entonces estudiando la etapa de importación de la base, la cual es fundamental en cualquier proyecto de análisis de datos. Si cometemos algún error en este paso, todos los resultados obtenidos a futuro se verán comprometidos.

  • Aunque este aspecto es pocas veces tenido en cuenta, contar con una estrategia bien diseñada para el almacenamiento y la lectura de la base es fundamental para facilitar las tareas posteriores de análisis.

  • Existen incontables ejemplos que respaldan esta afirmación. Veamos algunos casos resonantes:

    • El Departamento de Salud y Asistencia Social del Reino Unido "perdió" en octubre de 2020 unos 16.000 casos positivos de Covid-19 por usar una versión desactualizada de Excel para almacenar sus datos (Fuente: BBC).
    • El comité científico encargado de la nomenclatura de genes humanos (HGNC) se vio obligado a renombrar 27 genes cuyos nombres eran confundidos con fechas por cierto software de almacenamiento de datos. Este problema causó que aproximadamente un 20% de los artículos publicados entre 2005 y 2015 en journals del área genética contengan errores (Fuente: BioNews).
    • Durante la Guerra del Golfo (1990/91) un misil antiaéreo del ejército estadounidense falló debido a un problema de redondeo en el software utilizado, calculando erróneamente el tiempo transcurrido entre la detección de un misil enemigo y la hora actual. El error de redondeo (0.34 segundos cada 100 horas) trajo como consecuencia la muerte de 28 soldados estadounidenses (Fuente: Gobierno de EEUU).

  • Los ejemplos de este estilo son suficientes como para cubrir una clase entera, y dejan en claro que problemas graves de almacenamiento de datos pueden poner en riesgo no sólo nuestro puesto de trabajo o las finanzas de una empresa, sino también la salud pública, el avance científico y hasta la vida humana.

  • A continuación vamos a repasar dos casos problemáticos muy comunes:

Caso I: Recodificación

  • Una (mala) costumbre bastante arraigada entre algunos/as analistas de datos consiste en no llamar a las cosas por su nombre. Es común encontrar bases de datos donde alguna variable categórica está codificada mediante números, por ejemplo:

\[Nacionalidad = \begin{cases} 1\text{ si es Argentino/a} \\ 2\text{ si es Extranjero/a} \end{cases}\]

  • Emplear números en lugar de las categorías reales potencia la posibilidad de cometer errores, ya que implica pasos extra de limpieza, transformación o recodificación de datos que son totalmente evitables.

  • En otros tiempos, esta manera de trabajar era necesaria debido a que el software disponible para análisis de datos (por ej. SPSS) no permitía cargar bases con variables cualitativas, creando la necesidad de generar diccionarios que relacionen categorías con cifras. Además, los dígitos ocupan menos memoria que palabras enteras, detalle importante cuando el espacio disponible era escaso (no olvidemos que un diskette \(3_{1/2}\) tenía menos de 2 MB de capacidad!!!).

  • Hoy en día, salvo por cuestiones legales relacionadas a la anonimidad de los datos, esta práctica debería tratar de evitarse a toda costa.

Caso II: Datos Faltantes

  • Otra mala costumbre consiste en reemplazar valores faltantes (datos desconocidos, perdidos, NA, etc.) de variables numéricas por cifras fuera de escala, con la esperanza de que más adelante alguien se dé cuenta y los descarte.

  • Ejemplo: no conozco la edad de una persona incluida en mi base de datos, y en vez de dejar la celda vacía, escribo "0", "-1" o bien "200". Esto es peor todavía que recodificar variables categóricas innecesariamente, ya que es muy fácil pasar por alto inconsistencias de este tipo en grandes bases, siendo el riesgo doble:

    • Por un lado, vamos a creer que tenemos una base completa cuando en realidad hay muchos valores faltantes que no fueron identificados como tales; el tamaño de muestra real será menor al reportado, y la confianza en los resultados obtenidos, también.
    • Si calculamos promedios, desvíos, o cualquier otra medida resumen de tipo numérico estaremos incorporando datos falsos al análisis.

  • Por lo tanto, nunca está de más aclarar: no debemos usar valores numéricos para representar datos faltantes, ya que muy probablemente terminen causando errores en el análisis posterior.
  • Para finalizar esta introducción, aclaramos que cada proyecto de análisis de datos tendrá características particulares que lo diferenciarán del resto y, por lo tanto, no existe una única rutina "fija" de importación y limpieza que sirva para cualquier caso.

  • En lo que respecta a importar y/o limpiar una base, consideramos que un/a buen/a analista de datos se termina de formar con la experiencia práctica. Teniendo en cuenta esto, trataremos de presentar consejos generales y buenas prácticas para importar y manipular bases, poniendo mucho énfasis en las aplicaciones con ejemplos reales.

  • Durante esta clase vamos a aprender a:

    • Preparar nuestros datos antes de la importación
    • Importar los datos
    • Chequear si fueron importados correctamente
    • Solucionar algunos inconvenientes frecuentes

2 Datos ordenados

  • La expresión "Datos ordenados" (proveniente del término inglés tidy data) hace referencia a un conjunto de reglas utilizadas para almacenar datos de manera consistente. Puntualmente, se dice que un conjunto de datos "ordenado" debe cumplir las siguientes características:

    • La información debe estar organizada de manera matricial o tabular, es decir, en una estructura coherente de filas y columnas.
    • Cada fila de la base corresponde a una única observación o unidad muestral, ya sean éstas personas, plantas, objetos, regiones geográficas, etc. No puede haber información referida a más de un determinado individuo en una misma fila.
    • Cada columna de la base corresponde a una única variable: no se almacena un mismo atributo en dos o más columnas diferentes, ni una misma columna puede contener más de un atributo al mismo tiempo.

  • Esta definición hace énfasis en el concepto de orden, y si bien inicialmente puede parecer algo arbitraria, el hecho de ubicar a los individuos en las filas y a las variables en las columnas nos ayudará a tener un panorama mucho más claro de los datos. Además, este formato resulta fácil de manipular mediante los paquetes de software estadístico más populares.

  • Para más detalles sobre este concepto recomendamos leer el siguiente artículo: Wickham, Hadley (2014). Tidy data. Journal of Statistical Software, Vol. 59.

Todos los datasets ordenados se parecen entre sí, pero cada dataset desordenado es desordenado a su propia manera

Adaptado de la novela Anna Karenina (1877) escrita por León Tolstoi («Todas las familias felices se parecen unas a otras, pero cada familia infeliz lo es a su manera»).

2.1 Ejemplo: Precios de Autos 0KM

  • Veamos un ejemplo concreto, donde comparamos la evolución del precio en pesos argentinos de ciertos modelos de autos. Los valores corresponden a precios vigentes en julio 2021, según datos oficiales extraídos de ACARA.

  • ¿Cuáles de las siguientes tablas se encuentra en formato "ordenado"? ¿Cuántas variables hay en la base? ¿Y cuántas unidades tenemos?

Evolución de Precios de Automóviles - Visualización N° 1
Marca Modelo 2018 2019 2020 2021
Citroën Berlingo 1.459.200 1.552.300 1.651.400 2.020.600
Citroën C3 1.426.100 1.501.200 1.580.200 1.980.700
Fiat Argo 1.340.000 1.420.000 1.500.000 2.219.400
Fiat Mobi 910.000 980.000 1.070.000 1.586.400
Ford EcoSport 1.732.600 1.874.900 2.062.400 2.715.000
Ford KA 1.223.500 1.329.900 1.445.500 1.851.000
Peugeot 308 1.593.000 1.752.300 1.927.550 2.742.350
Peugeot 408 1.640.950 1.764.500 1.897.300 2.767.200
Renault Kangoo 1.746.350 1.877.800 2.033.800 2.608.250
Renault Kwid 880.000 968.000 1.064.800 1.651.600
Toyota Etios 1.350.000 1.420.000 1.495.000 1.804.000
Toyota Innova 3.145.000 3.445.000 3.750.000 4.938.500
Volkswagen Golf 4.300.000 4.550.000 4.800.000 5.828.000
Volkswagen Polo 1.575.000 1.675.000 1.775.000 2.287.950
Evolución de Precios de Automóviles - Visualización N° 2
Citroën
Fiat
Ford
Peugeot
Renault
Toyota
Volkswagen
Modelo Berlingo C3 Argo Mobi EcoSport KA 308 408 Kangoo Kwid Etios Innova Golf Polo
2018 1.459.200 1.426.100 1.340.000 910.000 1.732.600 1.223.500 1.593.000 1.640.950 1.746.350 880.000 1.350.000 3.145.000 4.300.000 1.575.000
2019 1.552.300 1.501.200 1.420.000 980.000 1.874.900 1.329.900 1.752.300 1.764.500 1.877.800 968.000 1.420.000 3.445.000 4.550.000 1.675.000
2020 1.651.400 1.580.200 1.500.000 1.070.000 2.062.400 1.445.500 1.927.550 1.897.300 2.033.800 1.064.800 1.495.000 3.750.000 4.800.000 1.775.000
2021 2.020.600 1.980.700 2.219.400 1.586.400 2.715.000 1.851.000 2.742.350 2.767.200 2.608.250 1.651.600 1.804.000 4.938.500 5.828.000 2.287.950
Evolución de Precios de Automóviles - Visualización N° 3
Marca Modelo Año Precio
Citroën Berlingo 2018 1.459.200
Citroën Berlingo 2019 1.552.300
Citroën Berlingo 2020 1.651.400
Citroën Berlingo 2021 2.020.600
Citroën C3 2018 1.426.100
Citroën C3 2019 1.501.200
Citroën C3 2020 1.580.200
Citroën C3 2021 1.980.700
Fiat Argo 2018 1.340.000
Fiat Argo 2019 1.420.000
Fiat Argo 2020 1.500.000
Fiat Argo 2021 2.219.400
Fiat Mobi 2018 910.000
Fiat Mobi 2019 980.000
Fiat Mobi 2020 1.070.000
Fiat Mobi 2021 1.586.400
Ford EcoSport 2018 1.732.600
Ford EcoSport 2019 1.874.900
Ford EcoSport 2020 2.062.400
Ford EcoSport 2021 2.715.000
Ford KA 2018 1.223.500
Ford KA 2019 1.329.900
Ford KA 2020 1.445.500
Ford KA 2021 1.851.000
Peugeot 308 2018 1.593.000
Peugeot 308 2019 1.752.300
Peugeot 308 2020 1.927.550
Peugeot 308 2021 2.742.350
Peugeot 408 2018 1.640.950
Peugeot 408 2019 1.764.500
Peugeot 408 2020 1.897.300
Peugeot 408 2021 2.767.200
Renault Kangoo 2018 1.746.350
Renault Kangoo 2019 1.877.800
Renault Kangoo 2020 2.033.800
Renault Kangoo 2021 2.608.250
Renault Kwid 2018 880.000
Renault Kwid 2019 968.000
Renault Kwid 2020 1.064.800
Renault Kwid 2021 1.651.600
Toyota Etios 2018 1.350.000
Toyota Etios 2019 1.420.000
Toyota Etios 2020 1.495.000
Toyota Etios 2021 1.804.000
Toyota Innova 2018 3.145.000
Toyota Innova 2019 3.445.000
Toyota Innova 2020 3.750.000
Toyota Innova 2021 4.938.500
Volkswagen Golf 2018 4.300.000
Volkswagen Golf 2019 4.550.000
Volkswagen Golf 2020 4.800.000
Volkswagen Golf 2021 5.828.000
Volkswagen Polo 2018 1.575.000
Volkswagen Polo 2019 1.675.000
Volkswagen Polo 2020 1.775.000
Volkswagen Polo 2021 2.287.950


  • El concepto de datos ordenados que acabamos de presentar se aplica generalmente en las etapas de almacenamiento y/o manipulación de la base, pero pierde fuerza durante la fase de comunicación y visualización. Esta distinción es importante, ya que la forma en que nos relacionamos con los datos dependerá de la etapa en la que nos encontremos.

  • Como vimos en este ejemplo, el formato ordenado (N° 3) resulta demasiado largo a la hora de publicar los datos. Dependiendo del espacio disponible en el documento a entregar, o bien de cuestiones estéticas, las visualizaciones 1 y 2 serán preferibles si necesitamos publicar la base entera.

Si bien las ocasiones en que debemos imprimir bases enteras en nuestros reportes es poco común, la moraleja que podemos extraer a partir del ejemplo es: un buen formato de almacenamiento no necesariamente es un buen formato de visualización, y al mismo tiempo, un buen formato de visualización no tiene por qué ser un buen formato de almacenamiento.

  • Por último, remarcamos que el formato ordenado tiende a presentar la información de un mismo individuo en varias filas diferentes (por ej. la información sobre un determinado modelo de auto está desparramada en 4 filas), situación que puede llegar a ser confusa para algunas personas.

  • Recordemos que una de las máximas del tidy data es asociar columnas con variables de manera biunívoca. Acomodar a cada modelo de auto en su propia fila, ocupando 4 columnas diferentes para registrar los precios (formato N° 1) es una violación de este principio.

  • ¿Cómo hacemos para transformar nuestra base de datos de un formato "largo" (tidy) a uno "ancho", o viceversa? En R, el paquete tidyr provee las funciones pivot_longer() y pivot_wider(), las cuales serán útiles en estos casos.

  • Si tenemos una base en formato ancho, como en el caso de la visualización n° 1, y pretendemos pasarla al formato largo, aplicamos pivot_longer() de esta manera:
library(tidyr)

pivot_longer(
  data = autos_ancho, #Nombre del dataset que tiene formato ancho
  cols = c(`2018`, `2019`, `2020`, `2021`) #Columnas que quiero apilar
)
  • Notemos que esta transformación no consiste en transponer la base, sino en apilar registros uno debajo del otro, reduciendo la cantidad de columnas pero aumentando el número de filas.

  • A su vez, el paso de formato largo a ancho se da mediante pivot_wider():

pivot_wider(
  data = autos_largo, #Nombre del dataset que tiene formato largo
  names_from = Año, #Variable cuyas categorías pasan a ser columnas
  values_from = Precio #Variable que uso para rellenar las nuevas columnas
)
  • Por cada valor distinto que haya en Año (en este caso 4 valores diferentes), la función pivot_wider() creará una nueva columna, asignando a cada una de ellas los datos correspondientes que figuren en la variable Precio.

  • En una transformación como esta debemos estar seguros/as de que cada combinación de las variables restantes (Marca, Modelo y Año) posean un único precio asociado; de lo contrario tendremos un problema a la hora de convertir la base.

  • Veamos un ejemplo simple para el modelo Toyota Etios, que ahora figura con 2 precios diferentes para el año 2021:

Ejemplo con Datos Repetidos - Formato Largo
Marca Modelo Año Precio
Toyota Etios 2018 1.350.000
Toyota Etios 2019 1.420.000
Toyota Etios 2020 1.495.000
Toyota Etios 2021 1.804.000
Toyota Etios 2021 1.600.000
  • El resultado que obtenemos al pasar esta base a formato ancho incluye una advertencia por parte de la función, siendo las columnas resultantes de tipo "lista" en vez de numérico:
Warning: Values are not uniquely identified; output will contain list-cols.
* Use `values_fn = list` to suppress this warning.
* Use `values_fn = length` to identify where the duplicates arise
* Use `values_fn = {summary_fun}` to summarise duplicates
Ejemplo con Datos Repetidos - Formato Ancho
Marca Modelo 2018 2019 2020 2021
Toyota Etios 1350000 1420000 1495000 1804000, 1600000

3 Tipos de archivos de datos

  • Para lo que viene, asumiremos que:

    • Ya hemos recolectado los datos necesarios para llevar a cabo nuestro análisis mediante encuestas, ensayos clínicos, estudios observacionales, exportación directa desde algún sistema de almacenamiento de datos, o cualquier otra metodología.

    • Guardamos la información en alguna base de datos accesible desde nuestra PC, ya sea en alguno de los formatos tradicionales (archivos de texto plano, Excel, etc.) o bien en cualquier otro medio digital que sea común dentro del ámbito donde nos desempeñamos.

    • Decidimos utilizar el software R para llevar a cabo el proceso de análisis.

  • R Base provee funciones que nos permiten importar archivos guardados en la mayoría de los formatos tradicionales, con la notable excepción de Excel, para lo cual necesitamos instalar un paquete específico.

  • A continuación repasaremos qué métodos existen para cada uno de estos formatos, y qué diferencias podemos encontrar entre las funciones tradicionales y las de paquetes especializados.

3.1 Formato txt

  • Corresponde a archivos de texto plano, llamados así porque no poseen ningún tipo de formato tipográfico extra (negrita, cursiva, tipo de fuente, etc.). Si bien generalmente los leemos desde el Bloc de Notas, su simplicidad permite que una gran variedad de programas puedan leer y editar su contenido. Cuando trabajamos con archivos txt es muy común usar tabulaciones como separadores de columnas, formato también conocido como tsv (tab-separated values).

  • Siempre que la estructura y/o tamaño de la base de datos lo permita, consideramos que esta es la manera más conveniente de compartir archivos. Además de la ya mencionada simplicidad, entre sus ventajas podemos agregar que ocupan poco espacio en disco, no traen problemas de incompatibilidad con versiones antiguas de sistemas operativos o software específico, y además evitamos la confusión de usar comas como separadores (cosa que ocurre con los archivos csv).

Datos Precios de Autos - Formato txt

Datos Precios de Autos - Formato txt

  • En R Base contamos con la función read.table() para importar datos desde un txt:
read.table(
  file = "C:/Mis Documentos/ArchivoImportante.txt", #Ruta del archivo
  sep = "\t" #Separador: Tabulaciones
)
  • Por otro lado, el paquete readr nos ofrece la función read_delim():
library(readr)
read_delim(
  file = "C:/Mis Documentos/ArchivoImportante.txt", #Ruta del archivo
  delim = "\t" #Separador: Tabulaciones
)
  • Ambas funciones ofrecen la posibilidad de definir un sinfín de detalles específicos a cada archivo, como encabezados de columnas, tipos de variables, símbolos utilizados como separadores de miles o decimales, codificación, etc. Para más información, podemos consultar las páginas de ayuda en los manuales de sus respectivos paquetes.

  • Existen algunas diferencias entre ellas que son dignas de mencionar:

    • El formato del objeto de salida será data.frame si usamos read.table() y tibble si usamos read_delim().

    • Algunas de las opciones por defecto difieren, en especial el formato asignado a los diferentes tipos de variables y el hecho de considerar si los datos poseen encabezado o no.

    • Es fácil comprobar que read_delim() es mucho más rápida a la hora de leer conjuntos de datos muy extensos. Otra función de importación de datos que se destaca por su rapidez es fread() del paquete data.table.

  • Para más detalles acerca de las diferencias entre data.frames y tibbles recomendamos consultar el capítulo 10.3 del libro R for Data Science. A grandes rasgos podemos decir que los tibbles, además de relacionarse de manera más fluida con las restantes funciones del tidyverse, toman las características esenciales de los data.frames y descartan ciertos comportamientos poco deseables asociados a formato de impresión, subseteo o tratamiento de variables categóricas.

3.2 Formato csv

  • Corresponde a archivos separado por comas (comma-separated values), y tal como ocurre con los txt, no poseen formato extra. En general podemos leerlos utilizando Excel o Bloc de Notas.

  • Si bien en la práctica se comportan como un txt que emplea comas para separar una columna de otra, poseen una desventaja: el hecho de reservar las comas como separador nos quita la posibilidad de utilizarlas como símbolo que da inicio a la parte decimal de un número. Además, para emplear comas dentro de una oración, tendremos que encerrar el texto entre comillas.

  • Frente a este problema, los sistemas operativos configurados en idioma español aplican un punto y coma ";" en lugar de la coma "," para separar columnas.

Datos Precios de Autos - Formato csv

Datos Precios de Autos - Formato csv

  • Para importar estos archivos en R podemos aplicar las funciones read.csv() o bien read_csv(), esta última también perteneciente al paquete readr.

3.3 Formato xlsx

  • Los archivos de Microsoft Excel, con extensión xlsx (xls para versiones anteriores a Office 2007), constituyen sin duda uno de los formatos más comunes de almacenamiento y edición de bases de datos.
Datos Precios de Autos - Formato xlsx

Datos Precios de Autos - Formato xlsx

  • Para poder importarlos a R recomendamos emplear la función read_excel() del paquete readxl, la cual nos da la posibilidad de elegir la hoja de cálculo que nos interesa y seleccionar rangos específicos dentro de ella:
library(readxl)
read_excel(
  path = "C:/Mis Documentos/ArchivoImportante.xlsx", #Ruta del archivo
  sheet = "Hoja3", #Nombre de la hoja de cálculo que queremos leer
  range = "B4:N88" #Rango de celdas que queremos leer
)
  • Al aplicar esta función obtenemos un objeto en R de clase tibble.

  • Existen paquetes como tidyxl que permiten importar datos desde archivos Excel incorporando los formatos de estilo puntuales de cada celda (color de relleno, texto en negrita, etc.). Si bien esta idea no es 100% compatible con el concepto de tidy data, puede ser una buena opción cuando la información contenida en las hojas de cálculo no sigue una estructura tradicional.

  • Dentro del ámbito de la Ciencia de Datos, Excel posee cierta mala fama, muchas veces por culpa de usuarios/as desprevenidos que causan desastres estadísticos (recordemos los casos mencionados sobre pérdida de datos sobre Covid y problemas en la nomenclatura de genes).

  • Si bien puede resultar muy útil cuando trabajamos con pocos datos o en ejercicios simples, no recomendamos emplear Excel para un análisis estadístico formal ya que no fue creado para tal fin: las herramientas que ofrece son escasas (o peores) en comparación a las disponibles en otros programas.

  • Además, el hecho de no ser gratuito (salvo en versiones específicas para estudiantes, como Office 365) y de no permitir llevar un registro de todos los pasos tomados (investigación reproducible), constituyen serias desventajas a la hora de usar Excel como software de análisis de datos.

  • Más allá de los obstáculos mencionados, Excel posee muchas virtudes que lo posicionan como una herramienta fundamental a la hora de organizar y guardar datos.

3.4 Otros Formatos

  • pdf: Si bien no es estrictamente un formato de almacenamiento de datos, muchas veces nos vemos obligados/as a extraer datos que se encuentran publicados dentro de un reporte o informe guardado en formato pdf. En estos casos podemos aplicar las funciones pdf_text() o pdf_data() del paquete pdftools para incorporar los datos a R, aunque es probable que luego de la importación sea necesario un proceso de edición, muchas veces tedioso, para convertir el texto leído a una base de datos formal.

  • html: Tal como ocurre con los pdf, la enorme cantidad de información disponible en páginas web ha repercutido notablemente en la popularidad de este formato de archivo en el contexto del almacenamiento de datos, generalmente con estructuras no tradicionales. Para importar archivos html a R utilizaremos los paquetes xml2 y rvest, los cuales estudiaremos más en detalle en la unidad dedicada a Web Scraping.

  • Software estadístico: Si bien no repasaremos estos casos a lo largo de la materia, usuarios/as de SAS, Stata, SPSS, Minitab o Matlab (entre otros) tienen la posibilidad de importar sus datos a R sin problemas. Para estos casos, aconsejamos revisar las funciones del paquete haven, que forma parte del tidyverse.

  • Formatos específicos: Muchas ramas de las ciencias aplicadas poseen formatos de almacenamiento de datos inherentes a su propia área. Los epidemiólogos utilizan salidas de Epi Info; quienes trabajan con datos geoespaciales utilizan archivos shp o geojson (entre tantos otros); aquellos fundamentalistas de R guardan sus datos en formato RData o rds, etc. Por suerte para nosotros/as, existen funciones o paquetes específicos de R que nos ayudan a importar archivos en la gran mayoría de los formatos más comunes, lo cual incluye todo lo mencionado anteriormente e incluso imágenes (png, jpg, bmp, etc.). Nombrar todas las posibilidades nos llevaría un curso entero; en cualquiera de estos casos recomendamos una simple búsqueda en Google que nos indique qué camino tomar, o bien consultar este manual oficial de R sobre importación y exportación de datos.

4 Problemas Frecuentes

  • Muchos problemas que surgen durante la etapa de importación de la base son fáciles de pasar por alto. A continuación repasaremos algunos de los inconvenientes más comunes que podemos encontrar al importar datos.

4.1 Datos faltantes

Problema: el archivo que quiero importar tiene datos faltantes

  • Esto es algo que ocurre con frecuencia y no necesariamente es un problema.
  • Si en nuestros archivos hay valores faltantes, ya sea porque son datos perdidos o porque sencillamente no corresponde su existencia, debemos dejar la celda vacía en Excel, o bien no escribir nada en el lugar correspondiente para archivos de texto.
  • Al importar el archivo, R detectará esos espacios vacíos y los completará con el valor lógico NA, que quiere decir, Not Available o no disponible.
  • Si nuestros archivos usan otra palabra o caracter especial para representar valores faltantes, debemos aclarárselo a R en la opción dedicada para ese fin en el menú de importación:
#Hoja de cálculo donde un guión o una X indican valores faltantes
read_excel("MiArchivo.xlsx", na = c("-", "X"))

4.2 Delimitación de columnas

Problema: El dataset importado tiene sólo una columna, pero debería haber más

  • Probablemente importamos un archivo como si estuviese separado por comas o tabulaciones, cuando en realidad no era así.
  • Arreglo: inspeccionar el archivo para determinar cuál es el delimitador correcto de los datos y realizar la importación otra vez, teniéndolo en cuenta.
  • Cualquier caracter puede servir de delimitador, sólo debemos notificárselo a R al momento de levantar la base:
#Archivo separado por arrobas
read_delim("MiArchivo.txt", delim = "@")

4.3 Rango equivocado

Problema: El dataset importado tiene más columnas/filas de lo que debería (con muchos NAs)

  • Este problema se obtiene al trabajar con archivos de Excel, donde se han guardado algunas columnas o filas vacías (sin datos) pero que poseen un formato diferente al resto.

  • En estos casos R entiende que esas celdas contienen información a pesar de estar vacías, y las incorpora al dataset con muchos valores faltantes (NA).

  • Para corregir este error, podemos borrar las celdas culpables directamente en Excel o bien filtrar el dataset en R para quedarnos con la sección que nos interesa.

4.4 Tipo de variables

Problema: Las variables del dataset importado no son del tipo que deberían

  • Es común observar este inconveniente cuando la base de datos importada posee números almacenados con una coma, los cuales serán interpretados erróneamente como texto. Dado que la mayoría de los lenguajes de programación fueron desarrollados por personas de habla inglesa, el símbolo usado por defecto para separar la parte entera de la decimal es el punto. Podemos corregir este comportamiento mediante el argumento dec en read.table() o bien a través del argumento locale en read_delim().

  • Pasar por alto este detalle puede llevarnos a problemas de cambio de escala involuntarios: si nuestro archivo posee el número mil quinientos almacenado con separador de miles ("1.500"), es probable que tras la importación el software lo convierta automáticamente a 1,5.

  • Las funciones que hemos visto hasta ahora tienen por costumbre adivinar el tipo de variable correspondiente a cada columna haciendo un escaneo rápido por las primeras filas de la base. Por ejemplo, el paquete readr decide qué clase asignar a las variables (numérica, textual, fecha, lógica, etc.) en base a las primeras 1.000 filas del archivo.

  • Si bien esto parece a priori una idea razonable, ciertas bases de datos pueden poseer una gran cantidad de valores faltantes. Imaginemos una columna con 6.000 observaciones, donde las primeras 2.000 corresponden al valor lógico NA y las siguientes 4.000 son números: en este caso se le asignará la clasificación logical a esa columna, perdiéndose la información numérica que se encuentra a continuación.

  • Para evitar estos problemas se recomienda aclarar en el proceso de importación la clase de variable correspondiente a cada columna del dataset, mediante los argumentos correspondientes a cada función (colClasses en read.table(), col_types en read_delim(), etc.). Si no conocemos de antemano las características de cada variable, también es posible aumentar la cantidad de casos a estudiar para tener menor probabilidad de error (ver argumento guess_max).

4.5 Codificación

Problema: aparecen caracteres raros cuando importo la base

  • Uno de los más comunes consiste en definir erróneamente la codificación (encoding) del archivo a importar, con lo cual ciertos símbolos de uso común en idioma español (ñ, letras con tilde, etc.) no se visualizarán correctamente.

  • En estos casos es importante conocer el encoding utilizado por el archivo: los más comunes son UTF-8, ASCII, ISO-8859-1 y ANSI, entre otros. Si trabajamos con R, todas las funciones populares de importación de bases brindan la opción de definir el encoding correcto; únicamente debemos estar atentos si la codificación de nuestro archivo difiere del default considerado por la función que usamos.

4.6 El archivo no existe

Problema: R no encuentra el archivo que queremos leer

  • Esto ocurre cuando R no encuentra el archivo que le indicamos, resultando generalmente en un mensaje del estilo:

    • Error: 'archivo.txt' does not exist in current working directory
    • Error in file(file, "rt") : cannot open the connection
    • cannot open file 'archivo.txt': No such file or directory

  • Es probable que hayamos escrito mal el nombre y/o ruta del archivo (siempre chequear puntuaciones, mayúsculas o minúsculas, etc.) o bien que se encuentre en una carpeta distinta a la indicada (revisar si está guardado en el working directory actual o bien en otra carpeta de nuestra PC).

4.7 Consejos Generales

  • Automatizar el proceso de importación lo máximo posible, evitando a toda costa el ingreso manual de información. Las encuestas en papel, el copiado a mano de datos entre una base y otra, etc. son cosas del pasado.

  • Contar con un buen sistema de resguardo de archivos (back-up), documentar todas las decisiones tomadas durante el procesamiento de los datos, y nunca eliminar la base original.

  • En procesos automáticos de recolección, chequear frecuentemente que los servidores tengan suficiente espacio para guardar las bases generadas, evitando la pérdida o truncamiento de datos. Si el proceso de recolección automática depende de una conexión a Internet, buscar "agujeros" en los datos que puedan haberse producido por cortes en el servicio.

  • En lo posible, unificar desde un principio las bases de datos. Si mi proceso de recolección ocurre a lo largo de 10 días, no es buena idea armar una nueva base para cada día, ya que perderemos tiempo unificando las bases y corremos el riesgo de elegir nombres de variables o criterios diferentes en cada una de ellas, haciéndolas incompatibles. Una buena idea es crear una única base, agregando por ejemplo una nueva columna donde se indique el día al que corresponde cada registro.

5 Datos: ventas de insumos de oficina

  • A lo largo de este curso utilizaremos un conjunto de datos sobre una gran tienda estadounidense de ventas minoristas de insumos, amoblamiento y tecnología para oficinas.
  • El archivo insumos.xlsx contiene los registros de las ventas realizadas durante 4 años, con las siguientes variables:

    • row_id: identificación única de cada fila del conjunto de datos
    • order_id: identificación única de cada pedido
    • order_date: fecha en que se pide el producto
    • ship_date: fecha de envío del producto
    • ship_mode: modalidad de envío
    • customer_id: identificador único del cliente
    • customer_name: nombre del cliente
    • segment: segmento o grupo de marketing al que pertenece el cliente, en base a sus intereses o características demográficas
    • country: país de destino del envío
    • city: ciudad y estado de destino del envío
    • postal_code: código postal de destino del envío
    • region: región geográfica de destino del envío (1: Central, 2: East, 3: South, 4: West)
    • product_id: identificador único del producto
    • category: categoría que engloba productos de características similares
    • subcategory: subdivisión a la que pertenece el producto dentro de su categoría
    • product_name: nombre del producto
    • sales: valor monetario de la transacción entre la tienda y el cliente, en USD
    • quantity: número de productos comercializados en la transacción
    • discount: porcentaje de deducción monetaria con respecto al precio habitual del producto
    • profit: ganancia en USD por la transacción

Así lucen los primeros 50 registros:

  • Utilizaremos estos datos para poner en práctica herramientas dedicadas a la manipulación, procesamiento, control, resumen y visualización, entre otras tareas que hacen al análisis exploratorio de datos.
  • Comenzamos preguntándonos...

Estos datos, ¿se presentan en un formato que puede considerarse ordenado o no?

6 Importación de datos en R

  • Llegó el momento de cargar los datos en R a partir del archivo insumos.xlsx.

  • RStudio provee ayuda para importar datos mediante el botón Import Dataset del panel superior derecho:

  • RStudio despliega una batería de opciones para la importación: tenemos la posibilidad de importar bases desde Excel, desde archivos de texto y también desde otros programas (SPSS, SAS, Stata).

  • La primera vez que realizamos esta acción, puede que RStudio pida permiso para instalar o actualizar algunos paquetes (Aceptar!).

  • Este modo de importar datos también nos muestra cuales son las sentencias correspondientes. Aconsejamos copiarlas y guardarlas en nuestro script, para evitar repetir este proceso la próxima vez que nos sentemos a trabajar (un script sin las sentencias de importación de datos está incompleto).

  • De hecho, a medida que nos familiarizamos con R, utilizaremos cada vez menos el menú de RStudio y comenzaremos a escribir manualmente las líneas de código que permiten realizar la importación.

library(readxl)
datos <- read_excel("datos/insumos.xlsx")

6.1 Explorar los datos importados

  • Podemos ver que nuestro flamante dataset figura ahora en la pestaña Environment junto con todas las otras cosas que están pasando por la cabeza de R en este momento.

  • Si hacemos click sobre el dataset en ese panel, se abrirá una ventana mostrándolo.

  • Lo mismo conseguimos con la función View("nombredeldataset").

  • Un paso razonable consiste en asegurarse que los datos que R acaba de leer realmente sean los que queríamos.

  • Algunas cosas que podemos chequear (recordar la sección anterior sobre problemas frecuentes):
    • Número correcto de filas y columnas
    • Nombres correctos para las variables
    • Tipos de variables (por ejemplo, R reconoció variables numéricas como tales y no como caracteres)
    • Codificación de caracteres
    • Etc.

  • Podemos explorar los datos cargados con algunas funciones básicas de R:

    • names() nos da los nombres asignados a cada columna (variable).
    • head() devuelve las primeras seis líneas del dataset (y adiviná qué hace tail()??).
    • dim() nos dice el número de filas y columnas.
    • str() describe toda la estructura del dataset, más o menos combinando toda la información anterior.
    • summary() es una función que se puede aplicar sobre distintos tipos de objetos. Cuando se la usa sobre un dataset, muestra un pequeño resumen de cada variable.
names(datos)
 [1] "row_id"        "order_id"      "order_date"    "ship_date"    
 [5] "ship_mode"     "customer_id"   "customer_name" "segment"      
 [9] "country"       "city"          "postal_code"   "region"       
[13] "product_id"    "category"      "subcategory"   "product_name" 
[17] "sales"         "quantity"      "discount"      "profit"       
head(datos)
# A tibble: 6 x 20
  row_id order_id order_date ship_date ship_mode customer_id customer_name
   <dbl> <chr>    <chr>      <chr>     <chr>     <chr>       <chr>        
1      1 CA-2018~ 1/3/2018   1/7/2018  Standard~ DP-13000    Darren Powers
2      2 CA-2018~ 1/4/2018   1/8/2018  Standard~ PO-19195    Phillina Ober
3      3 CA-2018~ 1/4/2018   1/8/2018  Standard~ PO-19195    Phillina Ober
4      4 CA-2018~ 1/4/2018   1/8/2018  Standard~ PO-19195    Phillina Ober
5      5 CA-2018~ 1/5/2018   1/12/2018 Standard~ MB-18085    Mick Brown   
6      6 CA-2018~ 1/6/2018   1/8/2018  Second C~ LS-17230    Lycoris Saun~
# ... with 13 more variables: segment <chr>, country <chr>, city <chr>,
#   postal_code <dbl>, region <dbl>, product_id <chr>, category <chr>,
#   subcategory <chr>, product_name <chr>, sales <dbl>, quantity <dbl>,
#   discount <dbl>, profit <dbl>
dim(datos)
[1] 9994   20
str(datos)
tibble [9,994 x 20] (S3: tbl_df/tbl/data.frame)
 $ row_id       : num [1:9994] 1 2 3 4 5 6 7 8 9 10 ...
 $ order_id     : chr [1:9994] "CA-2018-103800" "CA-2018-112326" "CA-2018-112326" "CA-2018-112326" ...
 $ order_date   : chr [1:9994] "1/3/2018" "1/4/2018" "1/4/2018" "1/4/2018" ...
 $ ship_date    : chr [1:9994] "1/7/2018" "1/8/2018" "1/8/2018" "1/8/2018" ...
 $ ship_mode    : chr [1:9994] "Standard Class" "Standard Class" "Standard Class" "Standard Class" ...
 $ customer_id  : chr [1:9994] "DP-13000" "PO-19195" "PO-19195" "PO-19195" ...
 $ customer_name: chr [1:9994] "Darren Powers" "Phillina Ober" "Phillina Ober" "Phillina Ober" ...
 $ segment      : chr [1:9994] "Consumer" "Home Office" "Home Office" "Home Office" ...
 $ country      : chr [1:9994] "United States" "United States" "United States" "United States" ...
 $ city         : chr [1:9994] "Houston, Texas" "Naperville, Illinois" "Naperville, Illinois" "Naperville, Illinois" ...
 $ postal_code  : num [1:9994] 77095 60540 60540 60540 19143 ...
 $ region       : num [1:9994] 1 1 1 1 2 4 3 3 3 3 ...
 $ product_id   : chr [1:9994] "OFF-PA-10000174" "OFF-LA-10003223" "OFF-ST-10002743" "OFF-BI-10004094" ...
 $ category     : chr [1:9994] "Office Supplies" "Office Supplies" "Office Supplies" "Office Supplies" ...
 $ subcategory  : chr [1:9994] "Paper" "Labels" "Storage" "Binders" ...
 $ product_name : chr [1:9994] "Message Book, Wirebound, Four 5 1/2\" X 4\" Forms/Pg., 200 Dupl. Sets/Book" "Avery 508" "SAFCO Boltless Steel Shelving" "GBC Standard Plastic Binding Systems Combs" ...
 $ sales        : num [1:9994] 16.45 11.78 272.74 3.54 19.54 ...
 $ quantity     : num [1:9994] 2 3 3 2 3 3 3 9 2 2 ...
 $ discount     : num [1:9994] 0.2 0.2 0.2 0.8 0.2 0 0 0 0 0 ...
 $ profit       : num [1:9994] 5.55 4.27 -64.77 -5.49 4.88 ...
summary(datos)
     row_id       order_id          order_date         ship_date        
 Min.   :   1   Length:9994        Length:9994        Length:9994       
 1st Qu.:2499   Class :character   Class :character   Class :character  
 Median :4998   Mode  :character   Mode  :character   Mode  :character  
 Mean   :4998                                                           
 3rd Qu.:7496                                                           
 Max.   :9994                                                           
                                                                        
  ship_mode         customer_id        customer_name        segment         
 Length:9994        Length:9994        Length:9994        Length:9994       
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
   country              city            postal_code        region     
 Length:9994        Length:9994        Min.   : 1040   Min.   :1.000  
 Class :character   Class :character   1st Qu.:23223   1st Qu.:2.000  
 Mode  :character   Mode  :character   Median :57103   Median :2.000  
                                       Mean   :55245   Mean   :2.571  
                                       3rd Qu.:90008   3rd Qu.:4.000  
                                       Max.   :99301   Max.   :4.000  
                                       NA's   :11                     
  product_id          category         subcategory        product_name      
 Length:9994        Length:9994        Length:9994        Length:9994       
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
     sales              quantity        discount          profit         
 Min.   :    0.444   Min.   : 1.00   Min.   :0.0000   Min.   :-6599.978  
 1st Qu.:   17.280   1st Qu.: 2.00   1st Qu.:0.0000   1st Qu.:    1.729  
 Median :   54.490   Median : 3.00   Median :0.2000   Median :    8.666  
 Mean   :  229.858   Mean   : 3.79   Mean   :0.1562   Mean   :   28.657  
 3rd Qu.:  209.940   3rd Qu.: 5.00   3rd Qu.:0.2000   3rd Qu.:   29.364  
 Max.   :22638.480   Max.   :14.00   Max.   :0.8000   Max.   : 8399.976  
                                                                         

6.2 Directorio de trabajo

  • Al seguir los caminos "fáciles" que nos provee RStudio, vemos que la sentencia que generó automáticamente la ventana de importación incluye el recorrido (o ruta) necesario para encontrar el archivo en nuestra compu.

  • Como ya dijimos, R siempre va a estar mirando en la carpeta que es el actual working directory. Si nuestro archivo está guardado en dicha carpeta, entonces no necesitamos especificar toda la ruta.

  • En este caso, proveer el nombre del archivo (por ejemplo insumos.xlsx) será suficiente.

  • Recordemos que podemos indicarle a R dónde mirar fijando el working directory en la carpeta que deseemos con la función setwd().

  • Por otro lado, si no deseamos cambiar nuestro working directory, podemos hacer referencia a otra carpeta de la compu con las siguientes estructuras:

Taquigrafía Significado
~ Directorio de inicio de la compu
. Directorio actual (wd)
.. Un directorio hacia arriba del wd actual
../.. Dos directorios hacia arriba del wd actual
  • Si, por ejemplo, el archivo se llama archivo.xlsx y está guardado en una subcarpeta de nuestro directorio de trabajo actual, usamos:
datos <- read_xlsx("NombreSubCarpeta/archivo.xlsx")
  • Si está guardado en la carpeta superior a nuestro directorio actual:
datos <- read_xlsx("../archivo.xlsx")
  • Si está en otra carpeta dentro de la carpeta superior a nuestro directorio actual:
datos <- read_xlsx("../NombreOtraCarpeta/archivo.xlsx")

7 Ejercicios

7.1 Películas

  • La página web IMDb publica información acerca de más de 6 millones de películas y series de televisión, incluyendo datos sobre aproximadamente 10 millones de actores, actrices, directores/as, productores/as y demás personas involucradas en la industria cinematográfica.

  • En el archivo pelis.txt se encuentran almacenados datos sobre 400.000 películas, los cuales fueron adaptados a partir de una base mucho mayor publicada por IMDb, disponible en este link.

  • La base cuenta con 4 variables:

    • Nombre: título de la película
    • Año: año en que fue estrenada la película
    • Dur: duración en minutos de la película
    • Género: etiquetas que describen el género de la película (drama, ciencia ficción, comedia, etc.)

  • Veamos sus primeras 10 filas:
Nombre Año Dur Género
Soldiers of the Cross 1900 NA Biography,Drama
Bohemios 1905 100 NA
The Story of the Kelly Gang 1906 70 Biography,Crime,Drama
Robbery Under Arms 1907 NA Drama
Amleto 1908 NA Drama
Don Quijote 1908 NA Drama
Don Álvaro o la fuerza del sino 1908 NA Drama
The Fairylogue and Radio-Plays 1908 120 Adventure,Fantasy
El pastorcito de Torrente 1908 NA Drama
Andreas Hofer 1909 NA Drama
  • Divididos en grupos, el ejercicio consiste en importar la base a R utilizando alguna de las siguientes 3 funciones:

    • read.table() de R Base
    • read_delim() del paquete readr
    • fread() del paquete data.table

/

  • Una vez finalizado el proceso, cada equipo deberá comparar su experiencia, comentando acerca de:

    • El tiempo empleado por la función en importar la base
    • Los argumentos de la función que debieron ser definidos para una correcta importación
    • La clase de objeto generado en R
    • El resultado que se obtiene al imprimir el objeto en la Consola de RStudio

/

  • Para el proceso de importación es fundamental tener en claro ciertas características del archivo:

    • Formato de codificación que posee
    • Símbolo empleado como separador de columnas
    • Manera de nombrar a los valores faltantes en cada variable

7.2 Bicicletas

  • Para ejemplificar el uso de funciones de importación de archivos en R, tomaremos prestado un conjunto de datos que se encuentra disponible en la Web de Datos Abiertos de la Municipalidad de Rosario.

  • La base a analizar contiene información sobre el uso del sistema Mi Bici Tu Bici, abarcando el período comprendido entre los meses de enero 2017 y enero 2019:

Período Viajes UsuariosActivos TiempoPromedio ViajesDiaLaboral ViajesDiaMedioFestivo ViajesDiaFestivo RankingEstaciones_1 RankingEstaciones_2 RankingEstaciones_3 RankingEstaciones_4 RankingEstaciones_5 AbonosDiarios AbonosMensuales AbonosAnuales
2017-01-01 12313 2002 19.6 459 273 227 Pichincha Distrito Centro Paseo Pellegrini Plaza López Museo Castagnino 3852 141 6
2017-02-01 12997 2105 18.9 557 255 327 Pichincha Distrito Centro Paseo Pellegrini Plaza López Fac. de Ciencias Económicas 3830 135 8
2017-03-01 16747 2399 19.5 606 319 429 Pichincha Distrito Centro Paseo Pellegrini Fac. de Ingeniería Fac. de Ciencias Económicas 4866 171 6
2017-04-01 14370 2326 18.1 638 318 269 Pichincha Fac. de Ingeniería Fac. Ciencias Económicas Paseo Pellegrini Distrito Centro 4257 168 23
2017-05-01 13210 1931 18.1 499 242 293 Pichincha Paseo Pellegrini Fac. Ciencias Económicas Fac. de Ingeniería Distrito Centro 3726 165 27
2017-06-01 10586 1567 19.1 400 267 231 Pichincha Paseo Pellegrini Plaza López Fac. Ciencias Económicas Distrito Centro 2898 123 12
2017-07-01 7528 1484 22.8 315 193 194 Pichincha Plaza López Paseo Pellegrini Distrito Centro Fac. Ciencias Económicas 2256 113 11
2017-08-01 19057 2828 19.1 705 305 464 Fac. Ciencias Económicas Paseo Pellegrini Pichinca Fac. de Ingeniería Plaza López 5904 291 27
2017-09-01 31819 4039 17.8 1196 738 841 Fac. de Ingeniería Paseo Pellegrini Fac. Ciencias Económicas Distrito Centro Fac. Medicina 8893 424 32
2017-10-01 46423 5533 18.0 1708 1136 1102 Paseo Pellegrini Fac. de Ingeniería Fac. Ciencias Económicas Fac. Medicina Plaza López 13951 629 26
2017-11-01 56656 6925 18.7 2078 1473 1426 Paseo Pellegrini Fac. de Ingeniería Fac. Ciencias Económicas Plaza López Pichincha 17121 679 31
2017-12-01 46246 6350 18.3 1793 1056 987 Paseo Pellegrini Fac. de Ingeniería Pichinca Fac. Ciencias Económicas Plaza Sarmiento 14085 524 35
2018-01-01 45724 6221 19.4 1660 1017 1027 Pichincha Paseo Pellegrini Museo Castagnino Distrito Centro Plaza López 14674 648 13
2018-02-01 48931 6688 18.7 2032 1294 1196 Plaza López Paseo Pellegrini Paseo Pellegrini II Fac. Ciencias Económicas Pichincha 15612 637 30
2018-03-01 63386 7666 19.1 2409 1256 1302 Plaza López Pichincha Fac. de Ingeniería Paseo Pellegrini II Fac. Ciencias Económicas 19330 771 26
2018-04-01 60489 7476 17.9 2456 1230 1078 Fac. Ciencias Económicas Paseo Pellegrini Plaza López Paseo Pellegrini II Fac. Medicina 16668 824 48
2018-05-01 53293 6860 18.0 1930 1385 1204 Paseo Pellegrini Fac. Ciencias Económicas Plaza López Pichincha Fac. Medicina 15331 752 30
2018-06-01 45573 5656 17.1 1860 1030 1016 Paseo Pellegrini Pichincha Fac. Ciencias Económicas Plaza López Paseo Pellegrini II 12049 580 32
2018-07-01 36227 4881 17.3 1321 849 850 Pichincha Paseo Pellegrini Plaza Sarmiento Plaza López Paseo Pellegrini II 9717 511 11
2018-08-01 54099 6302 17.3 1984 1215 1118 Pichincha Paseo Pellegrini Plaza Sarmiento Plaza López Fac. Ciencias Económicas 14873 690 21
2018-09-01 75150 7947 17.7 3070 1747 1615 Paseo Pellegrini Fac. de Ingeniería Plaza López Pichincha Plaza Sarmiento 18995 952 56
2018-10-01 79568 7925 17.2 2844 2008 1792 Paseo Pellegrini Plaza Sarmiento Fac. Medicina Plaza López Fac. de Ingeniería 19616 1021 36
2018-11-01 76932 7915 17.6 2908 1901 1654 Paseo Pellegrini Plaza Sarmiento Fac. Ciencias Económicas Plaza López Fac. de Ingeniería 18977 903 42
2018-12-01 64743 7166 18.6 2520 1548 1548 Plaza Sarmiento Pichincha Plaza López Paseo Pellegrini Fac. de Ingeniería 17430 679 53
2019-01-01 59427 6305 18.0 2152 1556 1170 Pichincha Paseo Pellegrini Plaza López Plaza Sarmiento Plaza Pringles 14910 695 42

/

  • Las variables presentes en la base son:

    • Período: Mes y año informados.
    • Viajes: Cantidad de viajes realizados en el período informado.
    • UsuariosActivos: Cantidad de usuarios que realizaron al menos un viaje en el período informado.
    • TiempoPromedio: Duración promedio (en minutos) de los viajes realizados en el período informado.
    • ViajesDiaLaboral: Cantidad de viajes en días laborales en el período informado / cantidad de días laborales en el período informado.
    • ViajesDiaMedioFestivo: Cantidad de viajes en días medio festivos en el período informado / cantidad de días medio festivos en el período informado.
    • ViajesDiaFestivo: Cantidad de viajes en días festivos en el período informado / cantidad de días festivos en el período informado.
    • RankingEstaciones_1: Estación en la ubicación n° 1 en el ranking respecto de la totalidad de retiros y devoluciones de bicicletas de la misma en el período informado.
    • RankingEstaciones_2: Estación en la ubicación n° 2 en el ranking respecto de la totalidad de retiros y devoluciones de bicicletas de la misma en el período informado.
    • RankingEstaciones_3: Estación en la ubicación n° 3 en el ranking respecto de la totalidad de retiros y devoluciones de bicicletas de la misma en el período informado.
    • RankingEstaciones_4: Estación en la ubicación n° 4 en el ranking respecto de la totalidad de retiros y devoluciones de bicicletas de la misma en el período informado.
    • RankingEstaciones_5: Estación en la ubicación n° 5 en el ranking respecto de la totalidad de retiros y devoluciones de bicicletas de la misma en el período informado.
    • AbonosDiarios: Cantidad de suscripciones diarias adquiridas por los usuarios en el período informado.
    • AbonosMensuales: Cantidad de suscripciones mensuales adquiridas por los usuarios en el período informado.
    • AbonosAnuales: Cantidad de suscripciones anuales adquiridas por los usuarios en el período informado.

  • El objetivo de este ejercicio es poner en práctica algunas herramientas básicas de importación de bases de datos en R.

  • Divididos en grupos, deberán resolver las siguientes consignas:

    1. Importar la base a RStudio usando la función read_delim() de readr, ya sea mediante código escrito a mano o desde el menú de importación de RStudio.
    2. Explorar el dataset importado mediante las funciones dim(), nrow(), ncol(), colnames(), str() y summary(). ¿Qué tipo de información provee cada una?
    3. ¿Detectan variables leídas incorrectamente, ya sea en cuanto a magnitud o formato?
    4. ¿Qué ocurre si no especificamos la codificación del archivo?
    5. ¿Y si no usamos el separador correcto?